///******************** NG.Respate(C)  **********************************
//* 产品名称: Respate 科技
//* 文件名称: Lap_FileAttribute.c
//* 程序作者: 雷帕特公司(南宫子萍)
//* 程序版本: V1.1														   
//* 编制日期: 2019/1/29
//* 功能描述: 获取文件属性
//* QQ:	2085827949
//**********************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#if 0
/** 
 * On success, zero is returned.  On error, -1  is  returned,  and  errno  is  set 
 *      appropriately. 
 */  
int check_fd_fine(int fd) {  
    struct stat _stat;  
    int ret = -1;  
    if(!fcntl(fd, F_GETFL))
	{  
        if(!fstat(fd, &_stat))
		{  
            if(_stat.st_nlink >= 1)  
                ret = 0;  
            else return -1;	// 此文件描述符不可用 
        }  
    }   
    return ret;  
}  




///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否link文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsLink ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISLNK (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否block文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsBlk ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISBLK (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否FIFO文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsFifo ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISFIFO (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否目录文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsDir ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISDIR (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否设备文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsDevice ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISCHR (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否普通文件
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int IsFile ( const char * szDirName )
{
        struct stat st;

        return ( lstat (szDirName, &st) == 0 && S_ISREG (st.st_mode) );
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否可读
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int canAccess ( const char *szFileName )
{
        if( access(szFileName, R_OK) == 0 )
                return 0;

        return -1;
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 判断是否可修改
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int canModify ( const char *szFileName )
{
        if ( access(szFileName, W_OK | R_OK) == 0 )
                return 0;

        return -1;
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 获取文件上次修改时间
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int FileLastMTime ( const char *szFileName )
{
        struct stat st;

        memset ( &st, 0, sizeof(struct stat) );
        if ( lstat (szFileName, &st) == 0 )
                return st.st_mtime;
       
        printf ( "%s FileLastMTime error %s\n", szFileName, strerror(errno) );
        return -1;
}

///////////////////////////////////////////////////////////////////////////////
// 功能说明 : 获取文件大小，以字节为单位
// 输入参数 :
// 输出参数 : VOID
// 返回值   : int
// 使用说明 :
///////////////////////////////////////////////////////////////////////////////
int FileSize ( const char *szFileName )
{
        struct stat st;
       
        memset ( &st, 0, sizeof(struct stat) );
        if ( lstat (szFileName, &st) == 0 )s
                return st.st_size;
       
        printf ( "%s FileSize error %s\n", szFileName, strerror(errno) );
        return -1;
}
#endif